﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;

namespace WebApplication1.Classes
{
    public class DataBase : IDisposable
    {
        private string connectionString = string.Empty;
        private SqlConnection sqlConnection;
        
        public DataBase()
        {
            connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename={0}App_Data\Database.mdf;Integrated Security=True;User Instance=True";
            connectionString = string.Format(connectionString, AppDomain.CurrentDomain.BaseDirectory);

            this.Open();
        }

        public void Dispose()
        {
            this.Close();
        }

        private void Open()
        {
            sqlConnection = new SqlConnection(connectionString);
            sqlConnection.Open();
        }

        private void Close()
        {
            sqlConnection.Close();
        }

        #region Pedido

        private Pedido InsertPedido(Pedido pedido, SqlTransaction sqlTransaction)
        {
            string sql = "INSERT INTO tb_pedido VALUES (@P_ID_CLIENTE, @P_VALOR_PEDIDO, @P_COD_RASTREAMENTO) SELECT @P_ID_PEDIDO = SCOPE_IDENTITY()";
            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Transaction = sqlTransaction;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO", System.Data.SqlDbType.Int, 10, "tb_pedido"));
            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_CLIENTE", System.Data.SqlDbType.VarChar, 100, "tb_pedido"));
            sqlCommand.Parameters.Add(new SqlParameter("@P_VALOR_PEDIDO", System.Data.SqlDbType.VarChar, 100, "tb_pedido"));
            sqlCommand.Parameters.Add(new SqlParameter("@P_COD_RASTREAMENTO", System.Data.SqlDbType.VarChar, 100, "tb_pedido"));

            sqlCommand.Parameters["@P_ID_PEDIDO"].Direction = System.Data.ParameterDirection.Output;
            sqlCommand.Parameters["@P_ID_CLIENTE"].Value = pedido.idCliente;
            sqlCommand.Parameters["@P_VALOR_PEDIDO"].Value = pedido.valorPedido;
            sqlCommand.Parameters["@P_COD_RASTREAMENTO"].Value = pedido.codRastreamento;

            sqlCommand.ExecuteScalar();

            pedido.idPedido = Convert.ToInt32(sqlCommand.Parameters["@P_ID_PEDIDO"].Value.ToString());

            return pedido;
        }

        public List<Pedido> GetListaPedidoByCliente(string idCliente)
        {
            List<Pedido> listaPedido = new List<Pedido>();
            SqlDataReader reader = null;

            string sql = "SELECT id_pedido, id_cliente, valorPedido, cod_rastreamento FROM tb_pedido WHERE id_cliente = @P_ID_CLIENTE";

            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_CLIENTE", System.Data.SqlDbType.VarChar, 100, "tb_pedido"));
            sqlCommand.Parameters["@P_ID_CLIENTE"].Value = idCliente;

            reader = sqlCommand.ExecuteReader();

            while (reader.Read())
            {
                int idPedidoReturn = Convert.ToInt32(reader["id_pedido"].ToString());
                decimal valorPedidoReturn = Convert.ToDecimal(reader["valorPedido"].ToString());
                string codRastreamentoReturn = reader["cod_rastreamento"].ToString();

                Pedido pedido = new Pedido(idPedidoReturn, idCliente, valorPedidoReturn, codRastreamentoReturn);

                listaPedido.Add(pedido);
            }

            reader.Close();

            listaPedido.ForEach((a) => a.Pagamento = this.GetPedidoPagamentoByPedido(a.idPedido));

            return listaPedido;
        }

        //todos os pedidos de um cliente

        #endregion

        #region Pedido Item

        private PedidoItem InsertPedidoItem(PedidoItem pedidoItem, SqlTransaction sqlTransaction)
        {
            string tableName = "tb_pedidoItem";

            string sql = "INSERT INTO {0} VALUES (@P_ID_PEDIDO, @P_ID_PEDIDO_PRODUTO) SELECT @P_ID_PEDIDO_ITEM = SCOPE_IDENTITY()";
            sql = string.Format(sql, tableName);

            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Transaction = sqlTransaction;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO_ITEM", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO_PRODUTO", System.Data.SqlDbType.VarChar, 4, tableName));

            sqlCommand.Parameters["@P_ID_PEDIDO_ITEM"].Direction = System.Data.ParameterDirection.Output;
            sqlCommand.Parameters["@P_ID_PEDIDO"].Value = pedidoItem.idPedido;
            sqlCommand.Parameters["@P_ID_PEDIDO_PRODUTO"].Value = pedidoItem.idProduto;

            sqlCommand.ExecuteScalar();

            pedidoItem.idPedido = Convert.ToInt32(sqlCommand.Parameters["@P_ID_PEDIDO_ITEM"].Value.ToString());

            return pedidoItem;
        }

        public List<PedidoItem> GetListaItemByPedido(int idPedido)
        {
            List<PedidoItem> listaItem = new List<PedidoItem>();
            SqlDataReader reader = null;

            string sql = "SELECT id_pedidoItem, id_pedido, id_produto FROM tb_pedidoItem WHERE id_pedido = @P_ID_PEDIDO";

            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO", System.Data.SqlDbType.Int, 10, "tb_pedidoItem"));
            sqlCommand.Parameters["@P_ID_PEDIDO"].Value = idPedido;

            reader = sqlCommand.ExecuteReader();

            while (reader.Read())
            {
                int idPedidoItemReturn = Convert.ToInt32(reader["id_pedidoItem"].ToString());
                int idProdutoReturn = Convert.ToInt32(reader["id_produto"].ToString());

                listaItem.Add(new PedidoItem(idPedidoItemReturn, idPedido, idProdutoReturn));
            }

            reader.Close();

            return listaItem;
        }


        //todos os itens de um pedido

        #endregion

        #region Pedido Pagamento
        
        private PedidoPagamento InsertPedidoPagamento(PedidoPagamento pedidoPagamento, SqlTransaction sqlTransaction)
        {
            string tableName = "tb_pedidoPagamento";

            string sql = "INSERT INTO {0} VALUES (@P_ID_PEDIDO, @P_TIPO_PAGAMENTO, @P_STATUS_CARTAO_CREDITO, @P_ID_TRANSACAO) SELECT @P_ID_PEDIDO_PAGAMENTO = SCOPE_IDENTITY()";
            sql = string.Format(sql, tableName);

            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Transaction = sqlTransaction;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO_PAGAMENTO", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PEDIDO", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_TIPO_PAGAMENTO", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_STATUS_CARTAO_CREDITO", System.Data.SqlDbType.Int, 4, tableName));
            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_TRANSACAO", System.Data.SqlDbType.Int, 4, tableName));

            sqlCommand.Parameters["@P_ID_PEDIDO_PAGAMENTO"].Direction = System.Data.ParameterDirection.Output;
            sqlCommand.Parameters["@P_ID_PEDIDO"].Value = pedidoPagamento.idPedido;
            sqlCommand.Parameters["@P_TIPO_PAGAMENTO"].Value = pedidoPagamento.tipoPagamento == int.MinValue ? DBNull.Value : (object)pedidoPagamento.tipoPagamento;
            sqlCommand.Parameters["@P_STATUS_CARTAO_CREDITO"].Value = pedidoPagamento.statusCartaoCredito == int.MinValue ? DBNull.Value : (object)pedidoPagamento.statusCartaoCredito;
            sqlCommand.Parameters["@P_ID_TRANSACAO"].Value = pedidoPagamento.idTransacao == int.MinValue ? DBNull.Value : (object)pedidoPagamento.idTransacao;

            sqlCommand.ExecuteScalar();

            pedidoPagamento.idPedidoPagamento = Convert.ToInt32(sqlCommand.Parameters["@P_ID_PEDIDO_PAGAMENTO"].Value.ToString());

            return pedidoPagamento;
        }

        public PedidoPagamento GetPedidoPagamentoByPedido(int idPedido)
        {
            PedidoPagamento pedidoPagamentoagamento = null;
            SqlDataReader reader = null;

            string sql = "SELECT id_pedidoPagamento, id_pedido, tipo_pagamento, status_cartao_credito, id_transacao FROM tb_pedidoPagamento WHERE id_pedido = @P_ID_PAGAMENTO";

            SqlCommand sqlCommand = new SqlCommand(sql);
            sqlCommand.Connection = sqlConnection;

            sqlCommand.Parameters.Add(new SqlParameter("@P_ID_PAGAMENTO", System.Data.SqlDbType.Int, 10, "tb_pedidoPagamento"));
            sqlCommand.Parameters["@P_ID_PAGAMENTO"].Value = idPedido;

            reader = sqlCommand.ExecuteReader();

            while (reader.Read())
            {
                pedidoPagamentoagamento = new PedidoPagamento();
                
                pedidoPagamentoagamento.idPedidoPagamento = Convert.ToInt32(reader["id_pedidoPagamento"].ToString());
                pedidoPagamentoagamento.idPedido = Convert.ToInt32(reader["id_pedido"].ToString());
                pedidoPagamentoagamento.tipoPagamento = reader["tipo_pagamento"] != DBNull.Value ? Convert.ToInt32(reader["tipo_pagamento"].ToString()): int.MinValue;
                pedidoPagamentoagamento.statusCartaoCredito = reader["status_cartao_credito"] != DBNull.Value ? Convert.ToInt32(reader["status_cartao_credito"].ToString()) : int.MinValue;
                pedidoPagamentoagamento.idTransacao = reader["id_transacao"] != DBNull.Value ? Convert.ToInt32(reader["id_transacao"].ToString()) : int.MinValue;
            }

            reader.Close();

            return pedidoPagamentoagamento;
        }

        #endregion

        #region Mandamento do Eizo

        public void SalvarPedidoCompleto(Pedido pedido)
        {
            using (SqlTransaction sqlTransaction = sqlConnection.BeginTransaction())
            {
                this.InsertPedido(pedido, sqlTransaction);

                pedido.PedidoItems.ForEach((pedidoItem) => 
                {
                     pedidoItem.idPedido = pedido.idPedido;
                    this.InsertPedidoItem(pedidoItem, sqlTransaction);
                });

                pedido.Pagamento.idPedido = pedido.idPedido;
                this.InsertPedidoPagamento(pedido.Pagamento, sqlTransaction);

                sqlTransaction.Commit();
            }
        }

		#endregion 
    }
}